home *** CD-ROM | disk | FTP | other *** search
/ 3D Game Programming All in One / 3D Game Programming All in One Disc.iso / 3D2E / RESOURCES / KOOB / control / server / players / beast.cs < prev    next >
Encoding:
Text File  |  2003-10-27  |  20.3 KB  |  773 lines

  1. //============================================================================
  2. // control/players/beast.cs
  3. //
  4. // Copyright (c) 2003 Kenneth C. Finney
  5. // Portions Copyright (c) 2001 GarageGames.Com
  6. // Portions Copyright (c) 2001 by Sierra Online, Inc.
  7. //============================================================================
  8.  
  9. // Load dts shapes and merge animations
  10. Exec("~/data/models/avatars/beast/player.cs");
  11.  
  12. // Timeouts for corpse deletion.
  13. $CorpseTimeout = 30000;
  14.  
  15. //
  16. $PlayerDeathAnim::TorsoFrontFallForward = 1;
  17. $PlayerDeathAnim::TorsoFrontFallBack = 2;
  18. $PlayerDeathAnim::TorsoBackFallForward = 3;
  19. $PlayerDeathAnim::TorsoLeftSpinDeath = 4;
  20. $PlayerDeathAnim::TorsoRightSpinDeath = 5;
  21. $PlayerDeathAnim::LegsLeftGimp = 6;
  22. $PlayerDeathAnim::LegsRightGimp = 7;
  23. $PlayerDeathAnim::TorsoBackFallForward = 8;
  24. $PlayerDeathAnim::HeadFrontDirect = 9;
  25. $PlayerDeathAnim::HeadBackFallForward = 10;
  26. $PlayerDeathAnim::ExplosionBlowBack = 11;
  27.  
  28. //----------------------------------------------------------------------------
  29. // Splash
  30. //----------------------------------------------------------------------------
  31.  
  32. datablock ParticleData(PlayerSplashMist)
  33. {
  34.    dragCoefficient      = 2.0;
  35.    gravityCoefficient   = -0.05;
  36.    inheritedVelFactor   = 0.0;
  37.    constantAcceleration = 0.0;
  38.    lifetimeMS           = 400;
  39.    lifetimeVarianceMS   = 100;
  40.    useInvAlpha          = false;
  41.    spinRandomMin        = -90.0;
  42.    spinRandomMax        = 500.0;
  43.    textureName          = "~/data/particles/splash";
  44.    colors[0]     = "0.7 0.8 1.0 1.0";
  45.    colors[1]     = "0.7 0.8 1.0 0.5";
  46.    colors[2]     = "0.7 0.8 1.0 0.0";
  47.    sizes[0]      = 0.5;
  48.    sizes[1]      = 0.5;
  49.    sizes[2]      = 0.8;
  50.    times[0]      = 0.0;
  51.    times[1]      = 0.5;
  52.    times[2]      = 1.0;
  53. };
  54.  
  55. datablock ParticleEmitterData(PlayerSplashMistEmitter)
  56. {
  57.    ejectionPeriodMS = 5;
  58.    periodVarianceMS = 0;
  59.    ejectionVelocity = 3.0;
  60.    velocityVariance = 2.0;
  61.    ejectionOffset   = 0.0;
  62.    thetaMin         = 85;
  63.    thetaMax         = 85;
  64.    phiReferenceVel  = 0;
  65.    phiVariance      = 360;
  66.    overrideAdvances = false;
  67.    lifetimeMS       = 250;
  68.    particles = "PlayerSplashMist";
  69. };
  70.  
  71.  
  72. datablock ParticleData(PlayerBubbleParticle)
  73. {
  74.    dragCoefficient      = 0.0;
  75.    gravityCoefficient   = -0.50;
  76.    inheritedVelFactor   = 0.0;
  77.    constantAcceleration = 0.0;
  78.    lifetimeMS           = 400;
  79.    lifetimeVarianceMS   = 100;
  80.    useInvAlpha          = false;
  81.    textureName          = "~/data/particles/splash";
  82.    colors[0]     = "0.7 0.8 1.0 0.4";
  83.    colors[1]     = "0.7 0.8 1.0 0.4";
  84.    colors[2]     = "0.7 0.8 1.0 0.0";
  85.    sizes[0]      = 0.1;
  86.    sizes[1]      = 0.3;
  87.    sizes[2]      = 0.3;
  88.    times[0]      = 0.0;
  89.    times[1]      = 0.5;
  90.    times[2]      = 1.0;
  91. };
  92.  
  93. datablock ParticleEmitterData(PlayerBubbleEmitter)
  94. {
  95.    ejectionPeriodMS = 1;
  96.    periodVarianceMS = 0;
  97.    ejectionVelocity = 2.0;
  98.    ejectionOffset   = 0.5;
  99.    velocityVariance = 0.5;
  100.    thetaMin         = 0;
  101.    thetaMax         = 80;
  102.    phiReferenceVel  = 0;
  103.    phiVariance      = 360;
  104.    overrideAdvances = false;
  105.    particles = "PlayerBubbleParticle";
  106. };
  107.  
  108. datablock ParticleData(PlayerFoamParticle)
  109. {
  110.    dragCoefficient      = 2.0;
  111.    gravityCoefficient   = -0.05;
  112.    inheritedVelFactor   = 0.0;
  113.    constantAcceleration = 0.0;
  114.    lifetimeMS           = 400;
  115.    lifetimeVarianceMS   = 100;
  116.    useInvAlpha          = false;
  117.    spinRandomMin        = -90.0;
  118.    spinRandomMax        = 500.0;
  119.    textureName          = "~/data/particles/splash";
  120.    colors[0]     = "0.7 0.8 1.0 0.20";
  121.    colors[1]     = "0.7 0.8 1.0 0.20";
  122.    colors[2]     = "0.7 0.8 1.0 0.00";
  123.    sizes[0]      = 0.2;
  124.    sizes[1]      = 0.4;
  125.    sizes[2]      = 1.6;
  126.    times[0]      = 0.0;
  127.    times[1]      = 0.5;
  128.    times[2]      = 1.0;
  129. };
  130.  
  131. datablock ParticleEmitterData(PlayerFoamEmitter)
  132. {
  133.    ejectionPeriodMS = 10;
  134.    periodVarianceMS = 0;
  135.    ejectionVelocity = 3.0;
  136.    velocityVariance = 1.0;
  137.    ejectionOffset   = 0.0;
  138.    thetaMin         = 85;
  139.    thetaMax         = 85;
  140.    phiReferenceVel  = 0;
  141.    phiVariance      = 360;
  142.    overrideAdvances = false;
  143.    particles = "PlayerFoamParticle";
  144. };
  145.  
  146.  
  147. datablock ParticleData( PlayerFoamDropletsParticle )
  148. {
  149.    dragCoefficient      = 1;
  150.    gravityCoefficient   = 0.2;
  151.    inheritedVelFactor   = 0.2;
  152.    constantAcceleration = -0.0;
  153.    lifetimeMS           = 600;
  154.    lifetimeVarianceMS   = 0;
  155.    textureName          = "~/data/particles/splash";
  156.    colors[0]     = "0.7 0.8 1.0 1.0";
  157.    colors[1]     = "0.7 0.8 1.0 0.5";
  158.    colors[2]     = "0.7 0.8 1.0 0.0";
  159.    sizes[0]      = 0.8;
  160.    sizes[1]      = 0.3;
  161.    sizes[2]      = 0.0;
  162.    times[0]      = 0.0;
  163.    times[1]      = 0.5;
  164.    times[2]      = 1.0;
  165. };
  166.  
  167. datablock ParticleEmitterData( PlayerFoamDropletsEmitter )
  168. {
  169.    ejectionPeriodMS = 7;
  170.    periodVarianceMS = 0;
  171.    ejectionVelocity = 2;
  172.    velocityVariance = 1.0;
  173.    ejectionOffset   = 0.0;
  174.    thetaMin         = 60;
  175.    thetaMax         = 80;
  176.    phiReferenceVel  = 0;
  177.    phiVariance      = 360;
  178.    overrideAdvances = false;
  179.    orientParticles  = true;
  180.    particles = "PlayerFoamDropletsParticle";
  181. };
  182.  
  183.  
  184. datablock ParticleData( PlayerSplashParticle )
  185. {
  186.    dragCoefficient      = 1;
  187.    gravityCoefficient   = 0.2;
  188.    inheritedVelFactor   = 0.2;
  189.    constantAcceleration = -0.0;
  190.    lifetimeMS           = 600;
  191.    lifetimeVarianceMS   = 0;
  192.    colors[0]     = "0.7 0.8 1.0 1.0";
  193.    colors[1]     = "0.7 0.8 1.0 0.5";
  194.    colors[2]     = "0.7 0.8 1.0 0.0";
  195.    sizes[0]      = 0.5;
  196.    sizes[1]      = 0.5;
  197.    sizes[2]      = 0.5;
  198.    times[0]      = 0.0;
  199.    times[1]      = 0.5;
  200.    times[2]      = 1.0;
  201. };
  202.  
  203. datablock ParticleEmitterData( PlayerSplashEmitter )
  204. {
  205.    ejectionPeriodMS = 1;
  206.    periodVarianceMS = 0;
  207.    ejectionVelocity = 3;
  208.    velocityVariance = 1.0;
  209.    ejectionOffset   = 0.0;
  210.    thetaMin         = 60;
  211.    thetaMax         = 80;
  212.    phiReferenceVel  = 0;
  213.    phiVariance      = 360;
  214.    overrideAdvances = false;
  215.    orientParticles  = true;
  216.    lifetimeMS       = 100;
  217.    particles = "PlayerSplashParticle";
  218. };
  219.  
  220. datablock SplashData(PlayerSplash)
  221. {
  222.    numSegments = 15;
  223.    ejectionFreq = 15;
  224.    ejectionAngle = 40;
  225.    ringLifetime = 0.5;
  226.    lifetimeMS = 300;
  227.    velocity = 4.0;
  228.    startRadius = 0.0;
  229.    acceleration = -3.0;
  230.    texWrap = 5.0;
  231.  
  232.    texture = "~/data/particles/splash";
  233.  
  234.    emitter[0] = PlayerSplashEmitter;
  235.    emitter[1] = PlayerSplashMistEmitter;
  236.  
  237.    colors[0] = "0.7 0.8 1.0 0.0";
  238.    colors[1] = "0.7 0.8 1.0 0.3";
  239.    colors[2] = "0.7 0.8 1.0 0.7";
  240.    colors[3] = "0.7 0.8 1.0 0.0";
  241.    times[0] = 0.0;
  242.    times[1] = 0.4;
  243.    times[2] = 0.8;
  244.    times[3] = 1.0;
  245. };
  246.  
  247.  
  248. //----------------------------------------------------------------------------
  249. // Foot puffs
  250. //----------------------------------------------------------------------------
  251.  
  252. datablock ParticleData(LightPuff)
  253. {
  254.    dragCoefficient      = 2.0;
  255.    gravityCoefficient   = -0.01;
  256.    inheritedVelFactor   = 0.6;
  257.    constantAcceleration = 0.0;
  258.    lifetimeMS           = 800;
  259.    lifetimeVarianceMS   = 100;
  260.    useInvAlpha          = true;
  261.    spinRandomMin        = -35.0;
  262.    spinRandomMax        = 35.0;
  263.    colors[0]     = "1.0 1.0 1.0 1.0";
  264.    colors[1]     = "1.0 1.0 1.0 0.0";
  265.    sizes[0]      = 0.1;
  266.    sizes[1]      = 0.8;
  267.    times[0]      = 0.3;
  268.    times[1]      = 1.0;
  269. };
  270.  
  271. datablock ParticleEmitterData(LightPuffEmitter)
  272. {
  273.    ejectionPeriodMS = 35;
  274.    periodVarianceMS = 10;
  275.    ejectionVelocity = 0.2;
  276.    velocityVariance = 0.1;
  277.    ejectionOffset   = 0.0;
  278.    thetaMin         = 20;
  279.    thetaMax         = 60;
  280.    phiReferenceVel  = 0;
  281.    phiVariance      = 360;
  282.    overrideAdvances = false;
  283.    useEmitterColors = true;
  284.    particles = "LightPuff";
  285. };
  286.  
  287. //----------------------------------------------------------------------------
  288. // Liftoff dust
  289. //----------------------------------------------------------------------------
  290.  
  291. datablock ParticleData(LiftoffDust)
  292. {
  293.    dragCoefficient      = 1.0;
  294.    gravityCoefficient   = -0.01;
  295.    inheritedVelFactor   = 0.0;
  296.    constantAcceleration = 0.0;
  297.    lifetimeMS           = 1000;
  298.    lifetimeVarianceMS   = 100;
  299.    useInvAlpha          = true;
  300.    spinRandomMin        = -90.0;
  301.    spinRandomMax        = 500.0;
  302.    colors[0]     = "1.0 1.0 1.0 1.0";
  303.    sizes[0]      = 1.0;
  304.    times[0]      = 1.0;
  305. };
  306.  
  307. datablock ParticleEmitterData(LiftoffDustEmitter)
  308. {
  309.    ejectionPeriodMS = 5;
  310.    periodVarianceMS = 0;
  311.    ejectionVelocity = 2.0;
  312.    velocityVariance = 0.0;
  313.    ejectionOffset   = 0.0;
  314.    thetaMin         = 90;
  315.    thetaMax         = 90;
  316.    phiReferenceVel  = 0;
  317.    phiVariance      = 360;
  318.    overrideAdvances = false;
  319.    useEmitterColors = true;
  320.    particles = "LiftoffDust";
  321. };
  322.  
  323.  
  324. //----------------------------------------------------------------------------
  325.  
  326. datablock DecalData(PlayerFootprint)
  327. {
  328.    sizeX       = 0.25;
  329.    sizeY       = 0.25;
  330.    textureName = "~/data/models/avatars/beast/footprint";
  331. };
  332.  
  333. datablock DebrisData( PlayerDebris )
  334. {
  335.    explodeOnMaxBounce = false;
  336.  
  337.    elasticity = 0.15;
  338.    friction = 0.5;
  339.  
  340.    lifetime = 4.0;
  341.    lifetimeVariance = 0.0;
  342.  
  343.    minSpinSpeed = 40;
  344.    maxSpinSpeed = 600;
  345.  
  346.    numBounces = 5;
  347.    bounceVariance = 0;
  348.  
  349.    staticOnMaxBounce = true;
  350.    gravModifier = 1.0;
  351.  
  352.    useRadiusMass = true;
  353.    baseRadius = 1;
  354.  
  355.    velocity = 20.0;
  356.    velocityVariance = 12.0;
  357. };
  358.  
  359. datablock PlayerData(BeastAvatar)
  360. {
  361.    renderFirstPerson = false;
  362.    emap = true;
  363.  
  364.    className = AIBeast;
  365.    shapeFile = "~/data/models/avatars/beast/player.dts";
  366.    cameraMaxDist = 3;
  367.    computeCRC = true;
  368.  
  369.    canObserve = true;
  370.    cmdCategory = "Clients";
  371.  
  372.    cameraDefaultFov = 90.0;
  373.    cameraMinFov = 5.0;
  374.    cameraMaxFov = 120.0;
  375.  
  376.    debrisShapeName = "~/data/models/avatars/beast/debris_player.dts";
  377.    debris = playerDebris;
  378.  
  379.    aiAvoidThis = true;
  380.  
  381.    minLookAngle = -1.4;
  382.    maxLookAngle = 1.4;
  383.    maxFreelookAngle = 3.0;
  384.  
  385.    mass = 90;
  386.    drag = 0.3;
  387.    maxdrag = 0.4;
  388.    density = 10;
  389.    maxDamage = 100;
  390.    maxEnergy =  60;
  391.    repairRate = 0.33;
  392.    energyPerDamagePoint = 75.0;
  393.  
  394.    rechargeRate = 0.256;
  395.  
  396.    runForce = 48 * 90;
  397.    runEnergyDrain = 0;
  398.    minRunEnergy = 0;
  399.    maxForwardSpeed = 14;
  400.    maxBackwardSpeed = 13;
  401.    maxSideSpeed = 13;
  402.  
  403.    maxUnderwaterForwardSpeed = 8.4;
  404.    maxUnderwaterBackwardSpeed = 7.8;
  405.    maxUnderwaterSideSpeed = 7.8;
  406.  
  407.    jumpForce = 8.3 * 90;
  408.    jumpEnergyDrain = 0;
  409.    minJumpEnergy = 0;
  410.    jumpDelay = 15;
  411.  
  412.    recoverDelay = 9;
  413.    recoverRunForceScale = 1.2;
  414.  
  415.    minImpactSpeed = 45;
  416.    speedDamageScale = 0.4;
  417.  
  418.    boundingBox = "1.2 1.2 2.3";
  419.    pickupRadius = 0.75;
  420.  
  421.    // Damage location details
  422.    boxNormalHeadPercentage       = 0.83;
  423.    boxNormalTorsoPercentage      = 0.49;
  424.    boxHeadLeftPercentage         = 0;
  425.    boxHeadRightPercentage        = 1;
  426.    boxHeadBackPercentage         = 0;
  427.    boxHeadFrontPercentage        = 1;
  428.  
  429.    // Foot Prints
  430.    decalData   = PlayerFootprint;
  431.    decalOffset = 0.25;
  432.  
  433.    footPuffEmitter = LightPuffEmitter;
  434.    footPuffNumParts = 10;
  435.    footPuffRadius = 0.25;
  436.  
  437.    dustEmitter = LiftoffDustEmitter;
  438.  
  439.    splash = PlayerSplash;
  440.    splashVelocity = 4.0;
  441.    splashAngle = 67.0;
  442.    splashFreqMod = 300.0;
  443.    splashVelEpsilon = 0.60;
  444.    bubbleEmitTime = 0.4;
  445.    splashEmitter[0] = PlayerFoamDropletsEmitter;
  446.    splashEmitter[1] = PlayerFoamEmitter;
  447.    splashEmitter[2] = PlayerBubbleEmitter;
  448.    mediumSplashSoundVelocity = 10.0;
  449.    hardSplashSoundVelocity = 20.0;
  450.    exitSplashSoundVelocity = 5.0;
  451.  
  452.    // Controls over slope of runnable/jumpable surfaces
  453.    runSurfaceAngle  = 70;
  454.    jumpSurfaceAngle = 80;
  455.  
  456.    minJumpSpeed = 20;
  457.    maxJumpSpeed = 30;
  458.  
  459.    horizMaxSpeed = 68;
  460.    horizResistSpeed = 33;
  461.    horizResistFactor = 0.35;
  462.  
  463.    upMaxSpeed = 80;
  464.    upResistSpeed = 25;
  465.    upResistFactor = 0.3;
  466.  
  467.    footstepSplashHeight = 0.35;
  468.  
  469.    //NOTE:  some sounds commented out until wav's are available
  470.  
  471.    // Footstep Sounds
  472. //   FootSoftSound        = FootLightSoftSound;
  473. //   FootHardSound        = FootLightHardSound;
  474. //   FootMetalSound       = FootLightMetalSound;
  475. //   FootSnowSound        = FootLightSnowSound;
  476. //   FootShallowSound     = FootLightShallowSplashSound;
  477. //   FootWadingSound      = FootLightWadingSound;
  478. //   FootUnderwaterSound  = FootLightUnderwaterSound;
  479.  
  480.    //FootBubblesSound     = FootLightBubblesSound;
  481.    //movingBubblesSound   = ArmorMoveBubblesSound;
  482.    //waterBreathSound     = WaterBreathMaleSound;
  483.  
  484.    //impactSoftSound      = ImpactLightSoftSound;
  485.    //impactHardSound      = ImpactLightHardSound;
  486.    //impactMetalSound     = ImpactLightMetalSound;
  487.    //impactSnowSound      = ImpactLightSnowSound;
  488.  
  489.    //impactWaterEasy      = ImpactLightWaterEasySound;
  490.    //impactWaterMedium    = ImpactLightWaterMediumSound;
  491.    //impactWaterHard      = ImpactLightWaterHardSound;
  492.  
  493.    groundImpactMinSpeed    = 10.0;
  494.    groundImpactShakeFreq   = "4.0 4.0 4.0";
  495.    groundImpactShakeAmp    = "1.0 1.0 1.0";
  496.    groundImpactShakeDuration = 0.8;
  497.    groundImpactShakeFalloff = 10.0;
  498.  
  499.    //exitingWater         = ExitingWaterLightSound;
  500.  
  501.    observeParameters = "0.5 4.5 4.5";
  502.  
  503.    // Allowable Inventory Items
  504.    maxInv[BulletAmmo] = 20;
  505.    maxInv[RifleAmmo] = 100;
  506.    maxInv[CrossbowAmmo] = 50;
  507.    maxInv[Crossbow] = 1;
  508.    maxInv[Rifle] = 1;
  509.  
  510.    // ai properties
  511.  
  512.    index = 0;
  513.    look = 0;
  514.    range = 0;
  515.    alertness = 10;
  516.    attention = 1;
  517.    threatAttention = 1;
  518.    aggression = 1.5;
  519. };
  520.  
  521.  
  522. //----------------------------------------------------------------------------
  523. // Armor Datablock methods
  524. //----------------------------------------------------------------------------
  525.  
  526. //----------------------------------------------------------------------------
  527.  
  528. function AIBeast::onAdd(%this,%obj)
  529. {
  530.    // Vehicle timeout
  531.    %obj.mountVehicle = true;
  532.  
  533.    // Default dynamic armor stats
  534.    %obj.setRechargeRate(%this.rechargeRate);
  535.    %obj.setRepairRate(0);
  536. }
  537.  
  538. function AIBeast::onRemove(%this, %obj)
  539. {
  540.    if (%obj.client.player == %obj)
  541.       %obj.client.player = 0;
  542. }
  543.  
  544. function AIBeast::onNewDataBlock(%this,%obj)
  545. {
  546. }
  547.  
  548.  
  549. //----------------------------------------------------------------------------
  550.  
  551. function AIBeast::onMount(%this,%obj,%vehicle,%node)
  552. {
  553.    if (%node == 0)  {
  554.       %obj.setTransform("0 0 0 0 0 1 0");
  555.       %obj.setActionThread(%vehicle.getDatablock().mountPose[%node],true,true);
  556.       %obj.lastWeapon = %obj.getMountedImage($WeaponSlot);
  557.  
  558.       %obj.unmountImage($WeaponSlot);
  559.       %obj.setControlObject(%vehicle);
  560.       %obj.client.setObjectActiveImage(%vehicle, 2);
  561.    }
  562. }
  563.  
  564. function AIBeast::onUnmount( %this, %obj, %vehicle, %node )
  565. {
  566.    if (%node == 0)
  567.       %obj.mountImage(%obj.lastWeapon, $WeaponSlot);
  568. }
  569.  
  570. function AIBeast::doDismount(%this, %obj, %forced)
  571. {
  572.    // This function is called by player.cc when the jump trigger
  573.    // is true while mounted
  574.    if (!%obj.isMounted())
  575.       return;
  576.  
  577.    // Position above dismount point
  578.    %pos    = getWords(%obj.getTransform(), 0, 2);
  579.    %oldPos = %pos;
  580.    %vec[0] = " 0  0  1";
  581.    %vec[1] = " 0  0  1";
  582.    %vec[2] = " 0  0 -1";
  583.    %vec[3] = " 1  0  0";
  584.    %vec[4] = "-1  0  0";
  585.    %impulseVec  = "0 0 0";
  586.    %vec[0] = MatrixMulVector( %obj.getTransform(), %vec[0]);
  587.  
  588.    // Make sure the point is valid
  589.    %pos = "0 0 0";
  590.    %numAttempts = 5;
  591.    %success     = -1;
  592.    for (%i = 0; %i < %numAttempts; %i++) {
  593.       %pos = VectorAdd(%oldPos, VectorScale(%vec[%i], 3));
  594.       if (%obj.checkDismountPoint(%oldPos, %pos)) {
  595.          %success = %i;
  596.          %impulseVec = %vec[%i];
  597.          break;
  598.       }
  599.    }
  600.    if (%forced && %success == -1)
  601.       %pos = %oldPos;
  602.  
  603.    %obj.mountVehicle = false;
  604.    %obj.schedule(4000, "setMountVehicle", true);
  605.  
  606.    // Position above dismount point
  607.    %obj.setTransform(%pos);
  608.    %obj.applyImpulse(%pos, VectorScale(%impulseVec, %obj.getDataBlock().mass));
  609.    %obj.setPilot(false);
  610.    %obj.vehicleTurret = "";
  611. }
  612.  
  613.  
  614. //----------------------------------------------------------------------------
  615.  
  616. function AIBeast::onCollision(%this,%obj,%col)
  617. {
  618.    if (%obj.getState() $= "Dead")
  619.       return;
  620.  
  621.    // Try and pickup all items
  622.    if (%col.getClassName() $= "Item")
  623.       %obj.pickup(%col);
  624.  
  625.    // Mount vehicles
  626.    %this = %col.getDataBlock();
  627.    if ((%this.className $= WheeledVehicleData) && %obj.mountVehicle &&
  628.          %obj.getState() $= "Move" && %col.mountable) {
  629.  
  630.       // Only mount drivers for now.
  631.       %node = 0;
  632.       %col.mountObject(%obj,%node);
  633.       %obj.mVehicle = %col;
  634.    }
  635. }
  636.  
  637. function AIBeast::onImpact(%this, %obj, %collidedObject, %vec, %vecLen)
  638. {
  639.    %obj.damage(0, VectorAdd(%obj.getPosition(),%vec),
  640.       %vecLen * %this.speedDamageScale, "Impact");
  641. }
  642.  
  643.  
  644. //----------------------------------------------------------------------------
  645.  
  646. function AIBeast::damage(%this, %obj, %sourceObject, %position, %damage, %damageType)
  647. {
  648.    if (%obj.getState() $= "Dead")
  649.       return;
  650.    %obj.applyDamage(%damage);
  651.    %location = "Body";
  652.  
  653.    // Deal with client callbacks here because we don't have this
  654.    // information in the onDamage or onDisable methods
  655.    %client = %obj.client;
  656.    %sourceClient = %sourceObject ? %sourceObject.client : 0;
  657.  
  658.    if (%obj.getState() $= "Dead")
  659.       %client.onDeath(%sourceObject, %sourceClient, %damageType, %location);
  660. }
  661.  
  662. function AIBeast::onDamage(%this, %obj, %delta)
  663. {
  664.    // This method is invoked by the ShapeBase code whenever the
  665.    // object's damage level changes.
  666.    if (%delta > 0 && %obj.getState() !$= "Dead") {
  667.  
  668.       // Increment the flash based on the amount.
  669.       %flash = %obj.getDamageFlash() + ((%delta / %this.maxDamage) * 2);
  670.       if (%flash > 0.75)
  671.          %flash = 0.75;
  672.       %obj.setDamageFlash(%flash);
  673.  
  674.       // If the pain is excessive, let's hear about it.
  675.       if (%delta > 10)
  676.          %obj.playPain();
  677.    }
  678. }
  679.  
  680. function AIBeast::onDisabled(%this,%obj,%state)
  681. {
  682.    // The player object sets the "disabled" state when damage exceeds
  683.    // it's maxDamage value.  This is method is invoked by ShapeBase
  684.    // state mangement code.
  685.  
  686.    // If we want to deal with the damage information that actually
  687.    // caused this death, then we would have to move this code into
  688.    // the script "damage" method.
  689.    %obj.playDeathCry();
  690.    %obj.playDeathAnimation();
  691.    %obj.setDamageFlash(0.75);
  692.  
  693.    // Release the main weapon trigger
  694.    %obj.setImageTrigger(0,false);
  695.  
  696.    // Schedule corpse removal.  Just keeping the place clean.
  697.    %obj.schedule($CorpseTimeout - 1500, "startFade", 1500, 0, true);
  698.    %obj.schedule($CorpseTimeout, "delete");
  699. }
  700.  
  701.  
  702. //-----------------------------------------------------------------------------
  703.  
  704. function AIBeast::onLeaveMissionArea(%this, %obj)
  705. {
  706.    // Inform the client
  707. //   %obj.client.onLeaveMissionArea();
  708. }
  709.  
  710. function AIBeast::onEnterMissionArea(%this, %obj)
  711. {
  712.    // Inform the client
  713.    %obj.client.onEnterMissionArea();
  714. }
  715.  
  716. //-----------------------------------------------------------------------------
  717.  
  718. function AIBeast::onTrigger(%this, %obj, %triggerNum, %val)
  719. {
  720.    // This method is invoked when the player receives a trigger
  721.    // move event.  The player automatically triggers slot 0 and
  722.    // slot one off of triggers # 0 & 1.  Trigger # 2 is also used
  723.    // as the jump key.
  724. }
  725.  
  726.  
  727. //-----------------------------------------------------------------------------
  728. // Player methods
  729. //-----------------------------------------------------------------------------
  730.  
  731. //----------------------------------------------------------------------------
  732.  
  733. function Player::kill(%this, %damageType)
  734. {
  735.    %this.damage(0, %this.getPosition(), 10000, %damageType);
  736. }
  737.  
  738.  
  739. //----------------------------------------------------------------------------
  740.  
  741. function Player::mountVehicles(%this,%bool)
  742. {
  743.    // If set to false, this variable disables vehicle mounting.
  744.    %this.mountVehicle = %bool;
  745. }
  746.  
  747. function Player::isPilot(%this)
  748. {
  749.    %vehicle = %this.getObjectMount();
  750.    // There are two "if" statements to avoid a script Warning.
  751.    if (%vehicle)
  752.       if (%vehicle.getMountNodeObject(0) == %this)
  753.          return true;
  754.    return false;
  755. }
  756.  
  757.  
  758. //----------------------------------------------------------------------------
  759.  
  760. function Player::playDeathAnimation(%this)
  761. {
  762.    if (%this.deathIdx++ > 11)
  763.       %this.deathIdx = 1;
  764.    %this.setActionThread("Death" @ %this.deathIdx);
  765. }
  766.  
  767. function Player::playCelAnimation(%this,%anim)
  768. {
  769.    if (%this.getState() !$= "Dead")
  770.       %this.setActionThread("cel"@%anim);
  771. }
  772.  
  773.